﻿using System.Diagnostics.Contracts;
using System.Reactive.Concurrency;

namespace System.Reactive.Subjects
{
	public sealed class ReplaySubject<T>
	{
		public ReplaySubject(int bufferSize)
		{
			Contract.Requires(bufferSize >= 0, null, "bufferSize >= 0");
		}

		public ReplaySubject(IScheduler scheduler)
		{
			Contract.Requires(scheduler != null, null, "scheduler != null");
		}

		public ReplaySubject(TimeSpan window)
		{
			Contract.Requires(window >= TimeSpan.Zero, null, "window >= TimeSpan.Zero");
		}

		public ReplaySubject(int bufferSize, IScheduler scheduler)
		{
			Contract.Requires(bufferSize >= 0, null, "bufferSize >= 0");
			Contract.Requires(scheduler != null, null, "scheduler != null");
		}

		public ReplaySubject(int bufferSize, TimeSpan window)
		{
			Contract.Requires(bufferSize >= 0, null, "bufferSize >= 0");
			Contract.Requires(window >= TimeSpan.Zero, null, "window >= TimeSpan.Zero");
		}

		public ReplaySubject(TimeSpan window, IScheduler scheduler)
		{
			Contract.Requires(window >= TimeSpan.Zero, null, "window >= TimeSpan.Zero");
			Contract.Requires(scheduler != null, null, "scheduler != null");
		}

		public ReplaySubject(int bufferSize, TimeSpan window, IScheduler scheduler)
		{
			Contract.Requires(bufferSize >= 0, null, "bufferSize >= 0");
			Contract.Requires(window >= TimeSpan.Zero, null, "window >= TimeSpan.Zero");
			Contract.Requires(scheduler != null, null, "scheduler != null");
		}
	}
}